/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.resume.contrat.services.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.contrat.builder.ConsultContratDirector;
import fr.generali.accueilclient.contrat.builder.IConsultContratBuilder;
import fr.generali.accueilclient.contrat.om.IConsultContrat;
import fr.generali.accueilclient.resume.contrat.builder.DTOContrat2ConsultContratBuilder;
import fr.generali.accueilclient.resume.contrat.builder.IResumeContrat2IConsultContrat;
import fr.generali.accueilclient.resume.contrat.om.IResumeContrat;
import fr.generali.refservcommuns.rce.liste.contrats.consultationcontratpersonneservice.DossierContrat;
import fr.generali.refservcommuns.rce.liste.contrats.consultationcontratpersonneservice.ListeDossierContrat;
import fr.generali.refservcommuns.clients.resume.dto.v4.ctr.structurecontrat.DTOContrat;

/**
 * Classe de mapper utilisée par {@link ConsultContratService}
 * 
 * @author selrhazala
 */
@Component
public class ConsultContratServiceMapper {

    /**
     * Transforme un {@link ListeDossierContrat} en une liste de
     * {@link IConsultContrat}.
     * 
     * @param listeDossier la réponse du service S14
     * @return une liste de {@link IConsultContrat}
     */
    public List<IConsultContrat> mapperConsultationListeContratParIdClient(ListeDossierContrat listeDossier) {
        List<IConsultContrat> resultat = null;
        List<DossierContrat> listeDossierContrat = listeDossier.getDossierContrat();

        if (listeDossier != null && CollectionUtils.isNotEmpty(listeDossierContrat)) {
            resultat = new ArrayList<IConsultContrat>(0);
            for (DossierContrat dossier : listeDossierContrat) {

                List<DTOContrat> listeContrats = dossier.getContrat();

                mapperListeContrats(resultat, listeContrats);
            }
        }

        return resultat;
    }

    /**
     * Transforme un {@link ListeDossierContrat} en une liste de
     * {@link IConsultContrat}.
     * 
     * @param listeResumeContrats la liste Contrats du client
     * @return une liste de {@link IConsultContrat}
     */
    public List<IConsultContrat> mapperResumeContratToConsultContrat(List<IResumeContrat> listeResumeContrats) {
        List<IConsultContrat> resultat = null;

        if (CollectionUtils.isNotEmpty(listeResumeContrats)) {
            resultat = new ArrayList<IConsultContrat>(0);
            for (IResumeContrat contrat : listeResumeContrats) {

                IConsultContratBuilder consultContratBuilder = new IResumeContrat2IConsultContrat(contrat);
                ConsultContratDirector consultContratDirector = new ConsultContratDirector(consultContratBuilder);
                consultContratDirector.constructConsultContrat();
                IConsultContrat consultContrat = consultContratDirector.getConsultContrat();
                resultat.add(consultContrat);
            }
        }

        return resultat;
    }

    /**
     * @param resultat contrats destinataire
     * @param listeContrats source
     */
    private void mapperListeContrats(List<IConsultContrat> resultat, List<DTOContrat> listeContrats) {

        if (CollectionUtils.isNotEmpty(listeContrats)) {
            for (DTOContrat contratEnCours : listeContrats) {
                IConsultContratBuilder consultContratBuilder = new DTOContrat2ConsultContratBuilder(contratEnCours);
                ConsultContratDirector consultContratDirector = new ConsultContratDirector(consultContratBuilder);
                consultContratDirector.constructConsultContrat();
                IConsultContrat contrat = consultContratDirector.getConsultContrat();
                if (contrat != null) {
                    resultat.add(contrat);
                }
            }
        }
    }

}
